<?php
/** 
 * Servicio para la administracion de usuarios.
 * @author gemu
 * 
 * 
 */
class UsuarioService
{
	/**
	 * Da de alta un usuario.
	 * @param Usuario $usuario
	 */
	public function altaUsuario($usuario) {
		Validator::rechazarNoLogeado();
		Validator::validarNoVacio($usuario, 'usuario');
		Validator::validarNoVacio($usuario->habilitado, 'habilitado');
		Validator::validarNoVacio($usuario->alias, 'alias');
		Validator::validarNoVacio($usuario->rol, 'rol');
		Validator::validarNoVacio($usuario->rut, 'rut');
		
		$usuario->contrasena = ($usuario->contrasena == null) ? '' : $usuario->contrasena;
		$query = "INSERT INTO usuario(habilitado, alias, contrasena, rut, rol_nombre, nombre, apaterno, amaterno) "
			."VALUES(".($usuario->habilitado ? 'true' : 'false').", '".$usuario->alias."', '".md5($usuario->contrasena)."', "
			."'".$usuario->rut."', '".$usuario->rol."','".$usuario->nombre."', '".$usuario->apaterno."', "
			."'".$usuario->amaterno."')";
		try {
			Database::operacion($query);
		} catch (FatalException $e) {
			if($e->srcCode == 1062) {
				throw new ServiceException('error.registro_ya_existe');
			}
		}
	}
	
	/**
	 * Busca usuarios aplicando filtros.
	 * @param Usuario $usuario
	 * @param Paginador $paginador
	 * @return ListaPaginada
	 */
	public function buscarUsuario($usuario, $paginador) {
		Validator::rechazarNoLogeado();
        $lista = array();
        $filtro = $this->crearCadenaFiltro($usuario);
		
		$query = "SELECT * FROM usuario".$filtro;
		$result = Database::consulta($query, $paginador);
		while ($row = Database::obtenerFila($result)) {
			$usuario = new Usuario();
			$usuario->id = $row['id'];
			$usuario->rut = $row['rut'];
			$usuario->nombre = $row['nombre'];
			$usuario->apaterno = $row['apaterno'];
			$usuario->amaterno = $row['amaterno'];
			$usuario->rol = $row['rol_nombre'];
			$usuario->habilitado = ($row['habilitado']==true);
			$usuario->alias = $row['alias'];
			$lista[] = $usuario;
		}
		
		$listaPaginada = new ListaPaginada();
		$listaPaginada->lista = $lista;
		$listaPaginada->paginador = $paginador;
		return $listaPaginada;
	}
	
	/**
	 * Crea una cadena de filtro selectivo para usuario.
	 * @param Usuario $entidad
	 */
	private function crearCadenaFiltro($entidad) {
		$filtro = '';
        
        if ($entidad != null) {
            if ($entidad->id != null && is_numeric($entidad->id)) {
                $filtro .= "id = " . intval($entidad->id) . " AND ";
            }
            if ($entidad->alias != "") {
                $filtro .= "UPPER(alias) like '" .  strtoupper($entidad->alias) . "%' AND ";
            }
            if ($entidad->nombre != "") {
                $filtro .= "UPPER(nombre) like '" . strtoupper($entidad->nombre) . "%' AND ";
            }
            if ($entidad->apaterno != "") {
                $filtro .= "UPPER(apaterno) like '" . strtoupper($entidad->apaterno) . "%' AND ";
            }
            if ($entidad->amaterno != "") {
                $filtro .= "UPPER(amaterno) like '" . strtoupper($entidad->amaterno) . "%' AND ";
            }
            if ($entidad->rut != "") {
                $filtro .= "UPPER(rut) like '" . strtoupper($entidad->rut) . "%' AND ";
            }
            if ($entidad->rol != "") {
                $filtro .= "UPPER(rol_nombre) like '" . strtoupper($entidad->rol) . "%' AND ";
            }
            if ($filtro != "") {
                $filtro = " WHERE ".substr($filtro, 0, -5);	
			}
		}
		
		return $filtro;
	}
	
	/**
	 * Actualiza los datos del usuario.
	 * @param Usuario $usuario
	 */
	public function actualizarUsuario($usuario) {
		Validator::rechazarNoLogeado();
		Validator::validarNoVacio($usuario, 'usuario');
		Validator::validarNoVacio($usuario->id, 'id');
		Validator::validarNoVacio($usuario->habilitado, 'habilitado');
		Validator::validarNoVacio($usuario->alias, 'alias');
		Validator::validarNoVacio($usuario->rol, 'rol');
		Validator::validarNoVacio($usuario->rut, 'rut');
		
		if($this->isValidoId($usuario->id)) {
			$query = "UPDATE usuario SET habilitado=".($usuario->habilitado ? 'true' : 'false').", alias='".$usuario->alias."', "
			."rut='".$usuario->rut."', rol_nombre='".$usuario->rol."', nombre='".$usuario->nombre."', "
			."apaterno='".$usuario->apaterno."', amaterno='".$usuario->amaterno."' "
			."WHERE id=".$usuario->id;
			Database::operacion($query);
		} else {
			throw new ServiceException('error.validacion.usuario_no_existe');
		}
	}
	
	/**
	 * Habilita/Deshabilita el perfil del usuario.
	 * @param integer $id
	 * @param boolean $habilitado
	 */
	public function habilitarUsuario($id, $habilitado) {
		Validator::rechazarNoLogeado();
		Validator::validarNoVacio($habilitado, 'habilitado');
		
		if($this->isValidoId($id)) {
			$query = "UPDATE usuario SET habilitado=".($habilitado ? 'true' : 'false')." "
			."WHERE id=".$id;
			Database::operacion($query);
		} else {
			throw new ServiceException('error.validacion.usuario_no_existe');
		}
	}
	
	/**
	 * Comprueba si un usuario es valido
	 * @param integer $id
	 * @throws ServiceException
	 */
	private function isValidoId($id) {
		Validator::validarNoVacio($id, 'id');
		$query = "SELECT id FROM usuario WHERE id=".$id;
		$result = Database::consulta($query);
		if(Database::numeroFilas($result) != 1) {
			return false;
		}
		return true;
	}
}
?>